
#ifndef CENTRANCE_MQTT_CLIENT_H_
#define CENTRANCE_MQTT_CLIENT_H_

#include "CNetworkServiceHeader.h"

/**************************************************************************
Date: 2021-12-31
Description: MQTT
门禁MQTT 客服端实现
**************************************************************************/

NETWORKSERVICE_BEGIN_NAMESPACE

class NETWORKSERVICE_API CEntranceMqttClient{
public:
	CEntranceMqttClient();
	~CEntranceMqttClient();
	// 启动
	bool start();
	// 停止
	void stop();
	/**
	 *初始化产生
	 *
	 * @note
	 * @param[in] sOpts 服务器地址
	 * @param[in] sTlsOpts 授权账号
	 * @param[in] reconnectionTime 断开，或者连接失败重新连接时间
	 * @return -
	 */
	void init(string url,struct mg_mqtt_opts *sOpts,struct mg_tls_opts *sTlsOpts,int reconnectionTime=5000);
	/**
	 * 订阅
	 *
	 * @param[in] topics 主题
	 * qos = 0：最多分发一次。消息的传递完全依赖底层的TCP/IP网络，协议里没有定义应答和重试，消息要么只会到达服务端一次，要么根本没有到达。
	 * qos = 1：至少分发一次。服务器的消息接收由PUBACK消息进行确认，如果通信链路或发送设备异常，或者指定时间内没有收到确认消息，发送端会重发这条在消息头中设置了DUP位的消息。
	 * qos = 2：只分发一次。这是最高级别的消息传递，消息丢失和重复都是不可接受的，使用这个服务质量等级会有额外的开销。
	 * @return 消息ID -1失败
	 */
	bool subscribes(string topics,int qos = 0);


	/**
	 * 取消订阅
	 *
	 * @param[in] topics 主题
	 * @return 消息ID -1失败
	 */
	uint16_t unSubscribes(string topics);

	/**
	 * 发布消息
	 *
	 * @param[in] topics 主题
	 * @param[in] data   发布的数据
	 * @param[in] qos    消息质量
	 * @param[in] retain    消息是否保留
	 * @return 消息ID -1失败
	 */
	uint16_t publish(string topics,string &data,int qos=0,bool retain=false);

	// 获取连接状态
	bool getConnectStatus(){ return m_conStatus; }
public:
	// 连接状态回调
	void __conStatus(bool status);
	// 数据回调
	void __publishData(string topics,string &msg);
private:
	// mqtt 客户端
	CMqttClient m_mqttClient;
	// 连接状态
	bool		m_conStatus;
	// 订阅消息列表
	MAP<string,int> m_subscribesMap;
	// 回调
	tsMqttCb m_back;
};

NETWORKSERVICE_END_NAMESPACE

#endif // CENTRANCE_MQTT_CLIENT_B_H_
